package com.zhang.utils;


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

//自写的Jwt工具类，用于生成、解析jwt
@Data
@Component
@ConfigurationProperties(prefix = "user.jwt")   //可以在配置文件中配置参数值
public class JwtUtil {

    private long expire;    //过期时间
    private String secret;  //秘钥
    private String header;  //前端传过来的jwt的名称

    //生成jwt
    public String generateToken(String username){
        Date nowDate = new Date();
        Date expireDate = new Date(nowDate.getTime()+expire*1000);

        return Jwts.builder().setHeaderParam("typ","JWT")
                      .setSubject(username)
                      .setIssuedAt(nowDate)       //当前时间
                      .setExpiration(expireDate)  //过期时间,7天
                      .signWith(SignatureAlgorithm.HS512,secret)    //算法和秘钥
                      .compact();   //生成
    }

    //解析jwt
    public Claims getClaimByToken(String jwt){
        try {
            return Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(jwt)
                    .getBody();
        }catch (Exception e){
            return null;    //jwt被篡改会抛出异常，此时返回空代表jwt不合法
        }
    }

    //判断jwt是否过期
    public boolean tokenIsExpired(Claims claims){
        return claims.getExpiration().before(new Date());   //是否在当前时间之前
    }
}
